package com.minortheorie3.sudoku;

import sudoku.sudoku.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView;

public class SudokuSpelUI extends Activity {

	Context context;
	Dialog dialog;
	TextAdapter textAdapter;
	Vak huidigeVakje;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		context = this;
		setContentView(R.layout.main);

		bouwSpelbord();
	}

	/**
	 * Handler voor de klik listeners
	 */
	View.OnClickListener handler = new View.OnClickListener() {
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.button1:
				vulGetal(1);
				break;
			case R.id.button2:
				vulGetal(2);
				break;
			case R.id.button3:
				vulGetal(3);
				break;
			case R.id.button4:
				vulGetal(4);
				break;
			case R.id.button5:
				vulGetal(5);
				break;
			case R.id.button6:
				vulGetal(6);
				break;
			case R.id.button7:
				vulGetal(7);
				break;
			case R.id.button8:
				vulGetal(8);
				break;
			case R.id.button9:
				vulGetal(9);
				break;
			}
			dialog.cancel();
		}
	};

	/**
	 * Bouwt het spelbord opnieuw, speel opnieuw het spel
	 */
	public void bouwSpelbord() {
		Controller.getInstance().setContext(getApplicationContext());
		Controller.getInstance().vulVakjes();

		GridView gridview = (GridView) findViewById(R.id.gridview);
		textAdapter = new TextAdapter();
		gridview.setAdapter(textAdapter);

		gridview.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				showCijfersButtons(position);
			}
		});
	}

	/**
	 * Toont een popup dialoog met cijfers knoppen als de cijfers veranderbaar
	 * zijn
	 * 
	 * @param position
	 */
	public void showCijfersButtons(int position) {
		if (Controller.getInstance().getVakje(position).isVeranderbaar()) {
			dialog = new Dialog(context);
			huidigeVakje = Controller.getInstance().getVakje(position);

			dialog.setContentView(R.layout.popupbuttons);
			dialog.setTitle("Kies het getal om in te vullen:");
			dialog.setCancelable(true);

			// set onclick listeners
			dialog.findViewById(R.id.button1).setOnClickListener(handler);
			dialog.findViewById(R.id.button2).setOnClickListener(handler);
			dialog.findViewById(R.id.button3).setOnClickListener(handler);
			dialog.findViewById(R.id.button4).setOnClickListener(handler);
			dialog.findViewById(R.id.button5).setOnClickListener(handler);
			dialog.findViewById(R.id.button6).setOnClickListener(handler);
			dialog.findViewById(R.id.button7).setOnClickListener(handler);
			dialog.findViewById(R.id.button8).setOnClickListener(handler);
			dialog.findViewById(R.id.button9).setOnClickListener(handler);

			dialog.show();
		}
	}

	public void vulGetal(int getal) {

		TextView messagebox = (TextView) findViewById(R.id.

		message);

		try {

			Controller.getInstance().vulGetal(getal,

			huidigeVakje);

			if (Controller.getInstance().checkEindspel()) {

				if (Controller.getInstance().checkIsGewonnen()) {

					showUitslag(

					"Gefeliciteerd, gewonnen!");

				}

				else

				{

					showUitslag(

					"Helaas, niet gewonnen!");

				}

			}

			messagebox.setText(

			"");

		}

		catch (Exception e) {

			messagebox.setText(e.getMessage());

		}

		textAdapter.notifyDataSetChanged();

	}

	public void showUitslag(String uitslag) {

		AlertDialog.Builder dialoog =

		new AlertDialog.Builder(this);

		dialoog.setTitle(

		"Sudoku spel is afgelopen");

		String bericht = uitslag;

		dialoog.setMessage(bericht)

		.setCancelable(

		false)

		.setPositiveButton(
		"Speel opnieuw", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				bouwSpelbord();
				dialog.cancel();
			}

		});

		AlertDialog alert = dialoog.create();
		alert.setTitle("Spel is afgelopen");
		alert.show();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.speelOpnieuw:
			bouwSpelbord();
			break;
		}
		return true;
	}

	public class TextAdapter extends BaseAdapter {

		public TextAdapter() {

		}

		public int getCount() {
			return Controller.getInstance().getVakjes().size();
		}

		public Object getItem(int position) {
			return Controller.getInstance().getVakje(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {

			Vak vakje = Controller.getInstance().getVakje(position);
			TextView textview;
			if (convertView == null) {
				textview = vakje;
				textview.setLayoutParams(new GridView.LayoutParams(30, 35));
				textview.setGravity(Gravity.CENTER_HORIZONTAL);
				textview.setTypeface(null, Typeface.BOLD);
				textview.setTextSize(22);
			} else {
				textview = (TextView) convertView;
			}

			String getal = "";
			if (vakje.getGetal() != 0) {
				getal = vakje.getGetal() + "";
			}
			textview.setBackgroundColor(vakje.getColorCode());
			if (!vakje.isVeranderbaar()) {
				textview.setTextColor(Color.WHITE);
			} else {
				textview.setTextColor(R.color.tekstkleur);
			}
			textview.setText(getal);

			return textview;
		}
	}
}
